From 42aac3d370388c85ae21c33dd641eb4832dc3f41 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Fri, 4 Dec 2009 06:58:08 +0000 Subject: [PATCH] Add keyhandler 'g' to print all active grant table entries. Authored-By: Robert Phillips Signed-off-By: Konrad Rzeszutek Wilk --- xen/common/grant_table.c | 83 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index d046ec1139..c265f02cac 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #ifndef max_nr_grant_frames @@ -2502,6 +2503,88 @@ grant_table_destroy( d->grant_table = NULL; } +void gnttab_usage_print(struct domain *rd) +{ + int first = 1; + grant_ref_t ref; + + printk(" -------- active -------- -------- shared --------\n"); + printk("[ref] localdom mfn pin localdom gmfn flags\n"); + + spin_lock(&rd->grant_table->lock); + + for ( ref = 0; ref != nr_grant_entries(rd->grant_table); ref++ ) + { + struct active_grant_entry *act; + struct grant_entry_header *sha; + grant_entry_v1_t *sha1; + grant_entry_v2_t *sha2; + uint16_t status; + uint64_t frame; + + act = &active_entry(rd->grant_table, ref); + if ( !act->pin ) + continue; + + sha = shared_entry_header(rd->grant_table, ref); + + if ( rd->grant_table->gt_version == 1 ) + { + sha1 = &shared_entry_v1(rd->grant_table, ref); + sha2 = NULL; + status = sha->flags; + frame = sha1->frame; + } + else + { + sha2 = &shared_entry_v2(rd->grant_table, ref); + sha1 = NULL; + frame = sha2->full_page.frame; + status = status_entry(rd->grant_table, ref); + } + + if ( first ) + { + printk("grant-table for remote domain:%5d (v%d)\n", + rd->domain_id, rd->grant_table->gt_version); + first = 0; + } + + /* [ddd] ddddd 0xXXXXXX 0xXXXXXXXX ddddd 0xXXXXXX 0xXX */ + printk("[%3d] %5d 0x%06lx 0x%08x %5d 0x%06lx 0x%02x\n", + ref, act->domid, act->frame, act->pin, + sha->domid, frame, status); + } + + spin_unlock(&rd->grant_table->lock); + + if ( first ) + printk("grant-table for remote domain:%5d ... " + "no active grant table entries\n", rd->domain_id); +} + +static void gnttab_usage_print_all(unsigned char key) +{ + struct domain *d; + printk("%s [ key '%c' pressed\n", __FUNCTION__, key); + for_each_domain ( d ) + gnttab_usage_print(d); + printk("%s ] done\n", __FUNCTION__); +} + +static struct keyhandler gnttab_usage_print_all_keyhandler = { + .diagnostic = 1, + .u.fn = gnttab_usage_print_all, + .desc = "print grant table usage" +}; + +static int __init gnttab_usage_init(void) +{ + register_keyhandler('g', &gnttab_usage_print_all_keyhandler); + return 0; +} +__initcall(gnttab_usage_init); + /* * Local variables: * mode: C -- 2.30.2